home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Libraries / GUSI 1.4.1 / GUSI / Examples / GUSISocketTest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-25  |  3.7 KB  |  206 lines  |  [TEXT/MPS ]

  1. /*********************************************************************
  2. File        :    GUSI                    -    Grand Unified Socket Interface
  3. File        :    GUSISocketTest.c    -    Socket testing gear
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Language    :    MPW C
  6.  
  7. $Log: GUSISocketTest.c,v $
  8. Revision 1.1  1994/02/25  02:47:47  neeri
  9. Initial revision
  10.  
  11. Revision 0.1  1992/09/08  00:00:00  neeri
  12. Factor out more common code
  13.  
  14. *********************************************************************/
  15.  
  16. #include <GUSI.h>
  17. #include <GUSITest.h>
  18. #include <Types.h>
  19. #include <stdio.h>
  20. #include <fcntl.h>
  21. #include <string.h>
  22. #include <sys/errno.h>
  23.  
  24. int    sock        =    -1;
  25. int    accsock    =    -1;
  26.  
  27. void Close(char, char, const char *)
  28. {
  29.     if (close(sock))    {
  30.         printf("# close() returned error %s\n", Explain());
  31.         Where();
  32.     }
  33.     
  34.     sock        =    accsock;
  35.     accsock    =    -1;
  36. }
  37.  
  38. void Listen(char, char, const char *)
  39. {
  40.     if (sock == -1)    {
  41.         printf("# socket is not open\n");
  42.         Where();
  43.         
  44.         return;
  45.     }
  46.  
  47.     if (listen(sock, 5))    {
  48.         printf("# listen() returned error %s\n", Explain());
  49.         Where();
  50.     }
  51. }
  52.  
  53. void Write(char, char, const char * line)
  54. {
  55.     int len    =    strlen(line);
  56.     int part;
  57.  
  58.     if (sock == -1)    {
  59.         printf("# socket is not open\n");
  60.         Where();
  61.             
  62.         return;
  63.     }
  64.     
  65.     for (; len; len -= part, line += part) {
  66.         part = write(sock, line, len);
  67.         if (part < 0)    {
  68.             printf("# write(\"%s\") returned error %s\n", line, Explain());
  69.             Where();
  70.             
  71.             break;
  72.         }        
  73.     }
  74. }
  75.  
  76. void Read(char, char, const char *)
  77. {
  78.     int        len;
  79.     char         buf[500];
  80.     char *    line;
  81.     
  82.     if (sock == -1)    {
  83.         printf("# socket is not open\n");
  84.         Where();
  85.             
  86.         return;
  87.     }
  88.  
  89.     len    =    read(sock, buf, 500);
  90.     
  91.     if (len < 0)    {
  92.         printf("# read() returned error %s\n", Explain());
  93.     } else {
  94.         buf[len] = 0;
  95.         printf("# read() returned:\n");
  96.         
  97.         for (line = strtok(buf, "\n\r"); line; line = strtok(nil, "\n\r"))
  98.             printf("# %s\n", line);
  99.     }
  100.     
  101.     Where();
  102. }
  103.  
  104. void Select(char, char, const char *)
  105. {
  106.     int                res;
  107.     fd_set            rdfds;
  108.     fd_set            wrfds;
  109.     fd_set            exfds;
  110.     struct timeval    delay;
  111.     
  112.     if (sock == -1)    {
  113.         printf("# socket is not open\n");
  114.         Where();
  115.             
  116.         return;
  117.     }
  118.     
  119.     FD_ZERO(&rdfds);
  120.     FD_ZERO(&wrfds);
  121.     FD_ZERO(&exfds);
  122.     
  123.     FD_SET(sock, &rdfds);
  124.     FD_SET(sock, &wrfds);
  125.     FD_SET(sock, &exfds);
  126.     
  127.     delay.tv_sec    =    10;
  128.     delay.tv_usec    =    0;
  129.     
  130.     res = select(sock+1, &rdfds, &wrfds, &exfds, &delay);
  131.     
  132.     if (res < 0)    {
  133.         printf("# select() returned error %s\n", Explain());
  134.     } else if (!res) {
  135.         printf("# select() timed out\n");
  136.     } else {
  137.         printf(
  138.             "# select() returned %s%s%s\n", 
  139.             FD_ISSET(sock, &rdfds) ? "canRead " : "",
  140.             FD_ISSET(sock, &wrfds) ? "canWrite " : "",
  141.             FD_ISSET(sock, &exfds) ? "exception " : "");
  142.     }
  143.     
  144.     Where();
  145. }
  146.  
  147. void TogBlk(char, char, const char *)
  148. {
  149.     int    block;
  150.     
  151.     switch (fcntl(sock, F_GETFL, 0))    {
  152.     case 0:
  153.         block    =    1;
  154.         break;
  155.     default:
  156.         block =     0;
  157.         break;
  158.     case -1:
  159.         printf("# fcntl(F_GETFL) returned error %s\n", Explain());
  160.         Where();
  161.         
  162.         return;
  163.     }
  164.     
  165.     if (ioctl(sock, FIONBIO, &block))
  166.         printf(
  167.             "# ioctl(FIONBIO, %s) returned error %s\n", 
  168.             block ? "true" : "false", 
  169.             Explain());
  170.     else
  171.         printf("# Socket is now %s\n", block ? "nonblocking" : "blocking");
  172.     
  173.     Where();
  174. }
  175.  
  176. void NRead(char, char, const char *)
  177. {
  178.     int    nread;
  179.     
  180.     if (ioctl(sock, FIONREAD, &nread))
  181.         printf("# ioctl(FIONREAD) returned error %s\n", Explain());
  182.     else
  183.         printf("# %d bytes waiting to be read\n", nread);
  184.     
  185.     Where();
  186. }
  187.  
  188. void AddSocketCommands()
  189. {
  190.     COMMAND('l', 'i', Listen,  "",                 "Listen to socket");
  191.     COMMAND('c', 'l', Close,      "",                 "Close socket");
  192.     COMMAND('w', 'r', Write,     "text",             "Write a line");
  193.     COMMAND('r', 'd', Read,      "",                 "Read");
  194.     COMMAND('s', 'e', Select,  "",                 "Select a socket");
  195.     COMMAND('t', 'b', TogBlk,  "",                 "Toggle blocking status");
  196.     COMMAND('n', 'r', NRead,    "",                "Number of bytes to be read");
  197. }
  198.  
  199. void CleanupSockets()
  200. {
  201.     if (sock != -1)
  202.         close(sock);
  203.     if (accsock != -1)
  204.         close(accsock);
  205. }
  206.